<?php

if (!defined('BASEPATH'))
  exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */
// ------------------------------------------------------------------------

/**
 * Exceptions Class
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Exceptions
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/libraries/exceptions.html
 */
class CI_Exceptions {

  var $action;
  var $severity;
  var $message;
  var $filename;
  var $line;

  /**
   * Nesting level of the output buffering mechanism
   *
   * @var int
   * @access public
   */
  var $ob_level;

  /**
   * List if available error levels
   *
   * @var array
   * @access public
   */
  var $levels = array(
      E_ERROR => 'Error',
      E_WARNING => 'Warning',
      E_PARSE => 'Parsing Error',
      E_NOTICE => 'Notice',
      E_CORE_ERROR => 'Core Error',
      E_CORE_WARNING => 'Core Warning',
      E_COMPILE_ERROR => 'Compile Error',
      E_COMPILE_WARNING => 'Compile Warning',
      E_USER_ERROR => 'User Error',
      E_USER_WARNING => 'User Warning',
      E_USER_NOTICE => 'User Notice',
      E_STRICT => 'Runtime Notice'
  );

  /**
   * Constructor
   */
  public function __construct() {
    $this->ob_level = ob_get_level();
    // Note:  Do not log messages from this constructor.
  }

  // --------------------------------------------------------------------

  /**
   * Exception Logger
   *
   * This function logs PHP generated error messages
   *
   * @access	private
   * @param	string	the error severity
   * @param	string	the error string
   * @param	string	the error filepath
   * @param	string	the error line number
   * @return	string
   */
  function log_exception($severity, $message, $filepath, $line) {
    $severity = (!isset($this->levels[$severity])) ? $severity : $this->levels[$severity];

    log_message('error', 'Severity: ' . $severity . '  --> ' . $message . ' ' . $filepath . ' ' . $line, TRUE);
  }

  // --------------------------------------------------------------------

  /**
   * 404 Page Not Found Handler
   *
   * @access	private
   * @param	string	the page
   * @param 	bool	log error yes/no
   * @return	string
   */
  function show_404($page = '', $log_error = TRUE) {
    $heading = "404 Page Not Found";
    $message = "The page you requested was not found.";

    // By default we log this, but allow a dev to skip it
    if ($log_error) {
      log_message('error', '404 Page Not Found --> ' . $page);
    }

    echo $this->show_error($heading, $message, 'error_404', 404);
    exit;
  }

  // --------------------------------------------------------------------

  /**
   * General Error Page
   *
   * This function takes an error message as input
   * (either as a string or an array) and displays
   * it using the specified template.
   *
   * @access	private
   * @param	string	the heading
   * @param	string	the message
   * @param	string	the template name
   * @param 	int		the status code
   * @return	string
   */
  function show_error($heading, $message, $template = 'error_general', $status_code = 500) {
    set_status_header($status_code);

    $message = '<p>' . implode('</p><p>', (!is_array($message)) ? array($message) : $message) . '</p>';

    if (ob_get_level() > $this->ob_level + 1) {
      ob_end_flush();
    }
    ob_start();
    include(APPPATH . 'errors/' . $template . '.php');
    $buffer = ob_get_contents();
    ob_end_clean();
    return $buffer;
  }

  // --------------------------------------------------------------------

  /**
   * Native PHP error handler
   *
   * @access	private
   * @param	string	the error severity
   * @param	string	the error string
   * @param	string	the error filepath
   * @param	string	the error line number
   * @return	string
   */
  function show_php_error($severity, $message, $filepath, $line) {
    $severity = (!isset($this->levels[$severity])) ? $severity : $this->levels[$severity];

    $filepath = str_replace("\\", "/", $filepath);

    // For safety reasons we do not show the full file path
    if (FALSE !== strpos($filepath, '/')) {
      $x = explode('/', $filepath);
      $filepath = $x[count($x) - 2] . '/' . end($x);
    }

    if (ob_get_level() > $this->ob_level + 1) {
      ob_end_flush();
    }
    ob_start();
    include(APPPATH . 'errors/error_php.php');
    $buffer = ob_get_contents();
    ob_end_clean();
    echo $buffer;
  }

}

// END Exceptions Class

/* End of file Exceptions.php */
/* Location: ./system/core/Exceptions.php */